package htmlreader;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Server {
    public static int porta;
    public static File[] arquivosInternos;
    public static String[] listaDeNomesDosArquivos;

	/**
	 * @param args
	 */
	public static void main(String[] args) throws UnknownHostException {

        inicializarServer();

		try {
			ServerSocket serverSocket = new ServerSocket(porta);
			System.out.println("Server  running ..." + porta);
			executa(serverSocket);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	private static void executa(ServerSocket serverSocket) {
		while (true) {
			try {
				final Socket socket = serverSocket.accept();

				DataInputStream in = new DataInputStream(socket.getInputStream());
				DataOutputStream out = new DataOutputStream(socket.getOutputStream());

                
				String dado = in.readUTF();// recebe verificação ou solicitação
											// de dados

                /* 1- Listar Arquivos */
				if ("1".equals(dado)) {
					System.out.println("listarArquivo()");
					out.writeUTF("ECHO ::::listarArquivo");
                    out.flush();
                    out.close();

                    //Enviar lista de arquivos
                    Dados listaDeArquivos = new Dados();
                    listaDeArquivos.setListaDeArquivosDoServidor(listaDeNomesDosArquivos);
                    ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
                    output.flush();
                    output.writeObject(listaDeArquivos);
                    output.flush();
                    output.close();
                    //out.write(listaDeArquivos);
                    //out.writeUTF(listaDeNomesDosArquivos);

                /* 2- Recuperar Arquivo */
				} else if ("2".equals(dado)) {
					System.out.println("recuperarArquivo()");
					out.writeUTF("ECHO ::::recuperarArquivo");

                /* 3- Recuperar Imagem */
				} else if ("3".equals(dado)) {
					System.out.println("recuperarImagem()");
					out.writeUTF("ECHO ::::recuperarArquivo");

                /* Comando inválido */
				} else {
                    out.writeUTF("Erro! Comando inválido.");
                }

				in.close();
				out.close();
				socket.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

        //

	}
	
	public static void inicializarServer() throws UnknownHostException{
        
        InetAddress localHost = InetAddress.getLocalHost();

		System.out.println("============================");
        System.out.println("          SERVER");
        System.out.println("============================");
        System.out.println("\n\n");

        //Mostra ip da máquina onde está rodando o server
        System.out.println(":: Ip: " + localHost.getAddress().toString());

        //Usuário informa porta de conexão
        System.out.println(":: Informe a porta (padrão: 6789): ");
        Scanner scanner = new Scanner(System.in);
        String p = scanner.nextLine();

        if (!p.isEmpty()){
            porta = Integer.parseInt(p);
        }else{
            porta = 6789;
        }

        //Usuário informa pasta para compartilhar arquivos
        System.out.println("\n::Informe o caminho do diretório a ser compartilhado: ");
        p = scanner.nextLine();
        carregaDiretorios(p);

        //TODO: tratar a lista (somente *.html e imagens)
        if (arquivosInternos != null){
            System.out.println("::Lista de arquivos:");
            for(int i = 0; i < arquivosInternos.length; i++){
                System.out.println(arquivosInternos[i].getName());
            }
        }

	}

    public static void carregaDiretorios(String nomeDiretorio){

        //criar um objeto para o deretório
        File dirAtual = new File(nomeDiretorio);

        //criar um Array para os arquivos que estão dentro do diretório
        //e outro com os nomes dos arquivos
        arquivosInternos = dirAtual.listFiles();
        listaDeNomesDosArquivos = dirAtual.list();

        //Se encontrar algum subdiretório dentro do diretótio ele percorre
        //tudo o que foi encontrado com o loop(for).
        if(arquivosInternos != null){
           for(int i = 0; i< arquivosInternos.length; i++){

              if(arquivosInternos[i].exists() && arquivosInternos[i].isDirectory())
                 carregaDiretorios(arquivosInternos[i].getPath());
            }

        }


    }


}
